package com.gitee.qdbp.general.common.api.sequence.model;

import java.io.Serializable;

/**
 * 简单序列号规则
 *
 * @author zhaohuihua
 * @version 170930
 */
public class SimpleSequenceRule implements Serializable {

    /** 版本序列号 **/
    private static final long serialVersionUID = 1L;

    /** 名称 **/
    private String name;

    /** 前缀 **/
    private String prefix;

    /** 序号的位数(仅在有前缀时生效) **/
    private Integer digitNumber;

    /** 初始值(0表示随机初始值, 大于0表示指定初始值) **/
    private Long initValue;

    /** 当前值 **/
    private Long currValue;

    public SimpleSequenceRule() {
    }

    public SimpleSequenceRule(long initValue) {
        this(initValue, null, 0);
    }

    public SimpleSequenceRule(long initValue, String prefix, int digitNumber) {
        this.setPrefix(prefix);
        this.setDigitNumber(digitNumber);
        this.setInitValue(initValue);
        this.setCurrValue(initValue);
    }

    /** 获取名称 **/
    public String getName() {
        return name;
    }

    /** 设置名称 **/
    public void setName(String name) {
        this.name = name;
    }

    /** 获取前缀 **/
    public String getPrefix() {
        return prefix;
    }

    /** 设置前缀 **/
    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    /** 获取序号的位数(仅在有前缀时生效) **/
    public Integer getDigitNumber() {
        return digitNumber;
    }

    /** 设置序号的位数(仅在有前缀时生效) **/
    public void setDigitNumber(Integer digitNumber) {
        this.digitNumber = digitNumber;
    }

    /** 获取初始值(0表示随机初始值, 大于0表示指定初始值) **/
    public Long getInitValue() {
        return initValue;
    }

    /** 设置初始值(0表示随机初始值, 大于0表示指定初始值) **/
    public void setInitValue(Long initValue) {
        this.initValue = initValue;
    }

    /** 获取当前值 **/
    public Long getCurrValue() {
        return currValue;
    }

    /** 设置当前值 **/
    public void setCurrValue(Long currValue) {
        this.currValue = currValue;
    }

    /**
     * 将当前对象转换为子类对象
     *
     * @param clazz 目标类型
     * @return 目标对象
     */
    public <T extends SimpleSequenceRule> T to(Class<T> clazz) {
        T instance;
        try {
            instance = clazz.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to create " + clazz.getSimpleName() + " instance.", e);
        }

        instance.setName(this.getName()); // 名称
        instance.setPrefix(this.getPrefix()); // 前缀
        instance.setDigitNumber(this.getDigitNumber()); // 序号的位数(仅在有前缀时生效)
        instance.setInitValue(this.getInitValue()); // 初始值(0表示随机初始值, 大于0表示指定初始值)
        instance.setCurrValue(this.getCurrValue()); // 当前值
        return instance;
    }

}
